package com.dys;

import com.dys.util.DatabaseUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDateTime;

/**
 * @className: com.dys.DaoTest
 * @description: 时间类型处理-设置时间类型数据
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/09/12 下午11:01
 */
public class JavaSetDate {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) throws SQLException {
        testInsertJavaObject();
    }

    /**
     * 数据库时date类型,Java是java.sql.Date类型
     *
     * @throws SQLException
     */
    private static void testInsertJavaUtilDate() throws SQLException {
        // 1、获取连接
        Connection conn = DatabaseUtils.getConnection();
        // 2、编写SQL语句
        String sql = "insert into person(name, age,date_of_birth,email,address) values(?,?,?,?,?)";
        // 3、获取PreparedStatement，传入SQL
        PreparedStatement ps = conn.prepareStatement(sql);
        // 4、给占位符赋值
        ps.setString(1, "杨幂");
        ps.setInt(2, 31);
        ps.setDate(3, new java.sql.Date(new java.util.Date().getTime()));
        ps.setString(4, "1332@qq.com");
        ps.setString(5, "广东省深圳市罗湖区");
        // 5、执行SQL，获取结果
        int count = ps.executeUpdate();
        System.out.println("受影响行数：" + count);
        // 6、释放资源
        DatabaseUtils.closeAll(conn, ps);
    }

    /**
     * 数据库时datetime类型,Java是java.sql.Date类型,无法传递时分秒信息...
     *
     * @throws SQLException
     */
    private static void testInsertJavaUtilDate2() throws SQLException {
        // 1、获取连接
        Connection conn = DatabaseUtils.getConnection();
        // 2、编写SQL语句
        String sql = "insert into person(name, age,date_of_birth,email,address) values(?,?,?,?,?)";
        // 3、获取PreparedStatement，传入SQL
        PreparedStatement ps = conn.prepareStatement(sql);
        // 4、给占位符赋值
        ps.setString(1, "古力娜扎");
        ps.setInt(2, 31);
        ps.setDate(3, new java.sql.Date(new java.util.Date().getTime()));
        ps.setString(4, "1332@qq.com");
        ps.setString(5, "广东省深圳市罗湖区");
        // 5、执行SQL，获取结果
        int count = ps.executeUpdate();
        System.out.println("受影响行数：" + count);
        // 6、释放资源
        DatabaseUtils.closeAll(conn, ps);
    }

    /**
     * 数据库时timestamp类型,Java是java.sql.Date类型,无法传递时分秒信息...
     *
     * @throws SQLException
     */
    private static void testInsertJavaUtilDate3() throws SQLException {
        // 1、获取连接
        Connection conn = DatabaseUtils.getConnection();
        // 2、编写SQL语句
        String sql = "insert into person(name, age,date_of_birth,email,address) values(?,?,?,?,?)";
        // 3、获取PreparedStatement，传入SQL
        PreparedStatement ps = conn.prepareStatement(sql);
        // 4、给占位符赋值
        ps.setString(1, "古力娜扎");
        ps.setInt(2, 31);
        ps.setDate(3, new java.sql.Date(new java.util.Date().getTime()));
        ps.setString(4, "1332@qq.com");
        ps.setString(5, "广东省深圳市罗湖区");
        // 5、执行SQL，获取结果
        int count = ps.executeUpdate();
        System.out.println("受影响行数：" + count);
        // 6、释放资源
        DatabaseUtils.closeAll(conn, ps);
    }

    /**
     * 数据库时date类型,Java设置String类型,无法传递时分秒信息...
     *
     * @throws SQLException
     */
    private static void testInsertJavaString() throws SQLException {
        // 1、获取连接
        Connection conn = DatabaseUtils.getConnection();
        // 2、编写SQL语句
        String sql = "insert into person(name, age,date_of_birth,email,address) values(?,?,?,?,?)";
        // 3、获取PreparedStatement，传入SQL
        PreparedStatement ps = conn.prepareStatement(sql);
        // 4、给占位符赋值
        ps.setString(1, "古力娜扎");
        ps.setInt(2, 31);
        // String只要是时间格式就没问题
        // ps.setString(3, "2024-9-13");
        // 数据库设置为datetime，java代码中设置时分秒
        // ps.setString(3, "2024-9-13 19:56:22");
        // 数据库设置为timestamp类型，java代码中设置时分秒
        ps.setString(3, "2024-9-13 19:57:22");
        ps.setString(4, "1332@qq.com");
        ps.setString(5, "广东省深圳市罗湖区");
        // 5、执行SQL，获取结果
        int count = ps.executeUpdate();
        System.out.println("受影响行数：" + count);
        // 6、释放资源
        DatabaseUtils.closeAll(conn, ps);
    }

    /**
     * 数据库时date、datetime、timestamp类型,Java设置Object类型,无法传递时分秒信息...
     *
     * @throws SQLException
     */
    private static void testInsertJavaObject() throws SQLException {
        // 1、获取连接
        Connection conn = DatabaseUtils.getConnection();
        // 2、编写SQL语句
        String sql = "insert into person(name, age,date_of_birth,email,address) values(?,?,?,?,?)";
        // 3、获取PreparedStatement，传入SQL
        PreparedStatement ps = conn.prepareStatement(sql);
        // 4、给占位符赋值
        ps.setString(1, "古力娜扎");
        ps.setInt(2, 31);
        // String只要是时间格式就没问题
        // ps.setObject(3, "2024-9-13");
        // 数据库设置为datetime，java代码中设置时分秒
        // ps.setObject(3, "2024-9-13 19:56:22");
        // 数据库设置为timestamp类型，java代码中设置时分秒
        // ps.setObject(3, "2024-9-13 19:59:22");
        // ps.setObject(3, new java.util.Date());
        ps.setObject(3, LocalDateTime.now());
        ps.setString(4, "1332@qq.com");
        ps.setString(5, "广东省深圳市罗湖区");
        // 5、执行SQL，获取结果
        int count = ps.executeUpdate();
        System.out.println("受影响行数：" + count);
        // 6、释放资源
        DatabaseUtils.closeAll(conn, ps);
    }
}
